#ifndef PID_H
#define PID_H

typedef struct
{
    float kp;             // 比例系数
    float ki;             // 积分系数
    float kd;             // 微分系数
    float target;         // 目标值
    float actual;         // 实际值
    float error;          // 当前误差
    float error_last;     // 上次误差
    float integral;       // 积分项
    float integral_limit; // 积分限幅
    float output;         // PID输出
    float output_limit;   // 输出限幅
} positional_pid_t;


extern void positional_pid_init(positional_pid_t *pid, const float kp, const float ki, const float kd);

extern float positional_pid_calculate(positional_pid_t *pid, const float target, const float actual);

typedef struct
{
    float kp;           // 比例系数
    float ki;           // 积分系数
    float kd;           // 微分系数
    float target;       // 目标值
    float actual;       // 实际值
    float error;        // 当前误差
    float error_last;   // 上次误差
    float error_prev;   // 上上次误差
    float output;       // PID输出
    float output_limit; // 输出限幅
} incremental_pid_t;

extern void incremental_pid_init(incremental_pid_t *pid, const float kp, const float ki, const float kd);
extern float incremental_pid_calculate(incremental_pid_t *pid, const float target, const float actual);

#endif
